/**
 * ************************************************************************
 *
 * @file    fpk.h
 * @brief   fpk文件管理
 * @author  负号科技(fuhaokj@foxmail.com)
 * @version 0.1
 * @date    2024-08-23
 *
 * ************************************************************************
 *   __       _                 _    _
 *  / _|     | |               | |  (_)
 * | |_ _   _| |__   __ _  ___ | | ___
 * |  _| | | | '_ \ / _` |/ _ \| |/ / |
 * | | | |_| | | | | (_| | (_) |   <| |
 * |_|  \__,_|_| |_|\__,_|\___/|_|\_\ |
 *                                 _/ |
 *                                |__/
 *
 * @copyright Copyright (c) 2024 负号科技
 * For study and research only, no reprinting
 * ************************************************************************
 */
#ifndef __FPK_H__
#define __FPK_H__

#include <stdint.h>

#define FPK_NAME "fpk"
#define FPK_HEAD_NAME_MAX_LEN 4
#define FPK_FIRMWARE_VERSION_MAX_LEN 16
#define FPK_USER_STRING_MAX_LEN 16
#define FPK_PART_NAME_MAX_LEN 16
#define FPK_CONFIG_MAX_LEN 4
#define FPK_HEAD_CRC32_MAX_LEN 4

typedef struct
{
    char head_name[FPK_HEAD_NAME_MAX_LEN];         /*文件表示区域*/
    uint8_t config_info[FPK_CONFIG_MAX_LEN];       /*配置选项 byte1：固件类型 byte2：加密选项 byte3-4：保留*/
    char fw_old_ver[FPK_FIRMWARE_VERSION_MAX_LEN]; /*旧固件区域*/
    char fw_new_ver[FPK_FIRMWARE_VERSION_MAX_LEN]; /*新固件区域*/
    char user_string[FPK_USER_STRING_MAX_LEN];     /*用户水印*/
    char part_name[FPK_PART_NAME_MAX_LEN];         /*用户名分区*/
    uint32_t raw_size;                             /*固件大小单位byte 不含表头*/
    uint32_t pkg_size;                             /*打包后的固件大小*/
    uint32_t timestamp;                            /*打包时间*/
    uint32_t raw_crc32;                            /*源固件CRC*/
    uint32_t pkg_crc32;                            /*打包后CRC*/
    uint32_t head_crc32;                           /*表头CRC*/
}FPK_HEAD_INFO_TypeDef;

void fpk_HEAD_init(FPK_HEAD_INFO_TypeDef *fpk_head_info);
void fpk_HEAD_set_FirmwareVersion(FPK_HEAD_INFO_TypeDef *fpk_head_info, uint8_t main, uint8_t sub1, uint8_t sub2, uint8_t rc);
void fpk_HEAD_set_UserString(FPK_HEAD_INFO_TypeDef *fpk_head_info, char *user_string);
void fpk_HEAD_set_PartName(FPK_HEAD_INFO_TypeDef *fpk_head_info, char *part_name);
void fpk_HEAD_set_Encrypt(FPK_HEAD_INFO_TypeDef *fpk_head_info, uint8_t encrypt, char *key, char *iv);
void fpk_Pack(FPK_HEAD_INFO_TypeDef *fpk_head_info, char *binPath, char *fpkPath);
void FPK_StartPackag(char *iniPath);

#endif
